当前位置:首页 » 编程语言 » python父类属性

python父类属性

发布时间: 2022-09-21 01:44:56

python如果一个父类已经实例化了,现在想新建一个子类,给父类的这一个实例添加两个属性,如何实现

class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
class worker(People):
def __init__(self,name,age,salary):
super(worker,self).__init__(name,age)
self.salary = salary
tom = People("Tom", 22)
print type(tom).__name__
#not a safe way, but no new object
tom.__class__=worker
print type(tom).__name__
tom.salary = 250
print tom.salary
#safe way, but create a new object
workerTom = worker("Tom", 22, 200)
tom.__dict__ = workerTom.__dict__
print type(tom).__name__
print tom.salary

❷ Python父类怎样可以使用子类的属性和方法吗

父类不可以使用子类的属性和方法

❸ python属性可以继承吗继承

python属性可以继承,但是不支持私有继承。
继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子进程继承了父进程的所有公有实例变量和方法。继承实现了代码的重用。重用已经存在的数据和行为,减少代码的重新编写,python在类名后用一对圆括号表示继承关系,
括号中的类表示父类,如果父类定义了__init__方法,则子类必须显示地调用父类的__init__方法,如果子类需要扩展父类的行为,可以添加__init__方法的参数。

❹ python中子类在实例化时,能否增添父类没有的初始属性

1,如果你是想添加到__init__(对象)的对象里面,是不行的,子类调用对象不能多于或者异于父类。
2,如果你只是想单纯的加个属性,而不考虑实例、实参调用的便捷性,那么就随意加了。有以下方法:
a.直接在属性定义的位置加上self.形参=形参。
b.可以用def()方法调用或者修改形参(这里的形参也就是你说的属性)
c.可以用class类定义或者修改形参(2楼就是用的这个方法,还附了截图,注意他等号后面第一个字母是大写,所以是引用的class类)。

❺ Python继承父类parent的正确格式为

格式:

class 子类名(父类1,父类2)

类的继承就是让子类拥有父类的属性和方法。

几个注意:py支持多继承

子类继承的父类只能初始化一次,如果父类1和父类2有共同的父类或者祖先类,则类初始化的时候会失败。

当父类具有相同方法时,会调用最先继承的父类中的方法,如果要指定父类,则需要重写此方法,并通过父类名.方法名来调用指定父类方法。

❻ python 继承与类属性的使用

题主的注释是没有问题的。
子类继承父类后,会自动继承了父类的属性。如果在子类中修改了继承得来的类属性时(即B.count=200),并不会修改父类的对应的同名类属性(A.count)。以后只要是通过子类访问该属性,访问的都是子类的属性。
通过父类修改了父类属性后,子类访问该属性时,会访问父类修改后的属性值。当然前提是子类没有对该属性重新赋值过。

❼ python入门教程

Python语言是一种典型的脚本语言,简洁,语法约束少,接近人类语言。有丰富的数据结构,例如列表、字典、集合等。具有可移植性,支持面向过程和面向对象编程,并且开源。
下载安装:从python官网下载开发和运行环境程序。本例下载python-3.3.3.amd64的安装包,并安装。
开发工具:window系统中,python有多种开发工具,比如,一、直接在cmd命令窗口执行,但此种仅能单条语句执行,不能运行完整的程序。二、python自带的集成开发环境,可通过开始——所有程序——python3.3——IDLE(Python GUI)启动。三、其他集成开发环境,如PythonWin等,有编辑和调试能力,还实现了MFC类库存的包装。
本例中,使用python自带的开发环境。File—New File,新建py文档,编写程序,保存。Run——Run mole,可得到运行结果。
封装性:可以把属性、方法结合在一起,不可以直接访问对象的属性,仅能通过接口与对象发生联系。以下把方法和属性封装成了一个类。
构造器:python有3种类型的构造器,且一个类中仅可以定义一个构造器,若多个,则以最后为准。1.若不声明,则默认为一个没有任何操作的特殊的__init__方法,__init__(self),此时可通过obj = my_class()声明实例。 2.自声明__init__构造器,会覆盖默认的,且可以更新类的数据属性。3.构造器方法__new__(),用于不可变内置类型派生,不能通过实例访问属性,仅能通过类访问。
继承性:python支持多继承,且子类继承了父类的方法和属性。若子类中有和父类相同名称的方法,则子类会覆盖(Override)父类方法。父类方法依旧可以访问。
数据结构:有丰富的数据结构,例如列表、字典、集合等。本例简单介绍字典的使用。字典是键值对的无序集合,是可变对象。键在字典中是唯一的且必须是不可变对象。值可以是可变对象或不可变对象。以下例子对python字典的定义、访问、更新等的操作。
文件的读写:python系统提供open()函数建立文件对象,并打开要读写的文件。可对文件进行读,写,若不需要时,需关闭文件,释放系统资源。
其他:python的数据类型,如数字类型、字符串类型等。运算符、程序控制结构、函数、异常处理等内容。一些基本的用法,可在平时的使用中巩固加强。若熟知java,python上手会很快。

❽ python属性可以继承吗继承

python属性可以继承,但是不支持私有继承。
继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子进程继承了父进程的所有公有实例变量和方法。继承实现了代码的重用。重用已经存在的数据和行为,减少代码的重新编写,python在类名后用一对圆括号表示继承关系, 括号中的类表示父类,如果父类定义了__init__方法,则子类必须显示地调用父类的__init__方法,如果子类需要扩展父类的行为,可以添加__init__方法的参数。

❾ python中子类对父类初始化变量的赋值

1、使用self.x = x这样来添加变量
2、对于父类的初始化参数,如果不写,默认就使用父类无参的__init__方法
3、子类初始化父类参数B.__init__(self,aa,ab)
4、使用super(子类类型,子类对象).foo()调用父类方法

❿ python类的属性有哪几种如何访问它们

属性的访问机制

一般情况下,属性访问的默认行为是从对象的字典中获取,并当获取不到时会沿着一定的查找链进行查找。例如a.x的查找链就是,从a.__dict__['x'],然后是type(a).__dict__['x'],再通过type(a)的基类开始查找。

若查找链都获取不到属性,则抛出AttributeError异常。

一、__getattr__方法

这个方法是当对象的属性不存在是调用。如果通过正常的机制能找到对象属性的话,不会调用__getattr__方法。

classA:
a=1
def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)
#output
1
__getattr__call
b

二、__getattribute__方法

这个方法会被无条件调用。不管属性存不存在。如果类中还定义了__getattr__,则不会调用__getattr__()方法,除非在__getattribute__方法中显示调用__getattr__()或者抛出了AttributeError。

classA:
a=1
def__getattribute__(self,item):
print('__getattribute__call')
raiseAttributeError

def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)

所以一般情况下,为了保留__getattr__的作用,__getattribute__()方法中一般返回父类的同名方法:

def__getattribute__(self,item):
returnobject.__getattribute__(self,item)

使用基类的方法来获取属性能避免在方法中出现无限递归的情况。

三、__get__方法

这个方法比较简单说明,它与前面的关系不大。

如果一个类中定义了__get__(),__set__()或__delete__()中的任何方法。则这个类的对象称为描述符。

classDescri(object):
def__get__(self,obj,type=None):
print("callget")

def__set__(self,obj,value):
print("callset")

classA(object):
x=Descri()

a=A()
a.__dict__['x']=1#不会调用__get__
a.x#调用__get__
如果查找的属性是在描述符对象中,则这个描述符会覆盖上文说的属性访问机制,体现在查找链的不同,而这个行文也会因为调用的不同而稍有不一样:

  • 如果调用是对象实例(题目中的调用方式),a.x则转换为调用:。type(a).__dict__['x'].__get__(a, type(a))
  • 如果调用的是类属性,A.x则转换为:A.__dict__['x'].__get__(None, A)
  • 其他情况见文末参考资料的文档

  • 四、__getitem__方法

  • 这个调用也属于无条件调用,这点与__getattribute__一致。区别在于__getitem__让类实例允许[]运算,可以这样理解:
  • __getattribute__适用于所有.运算符;
  • __getitem__适用于所有[]运算符。
  • classA(object):

  • a=1


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnitem


  • t=A()

  • print(t['a'])

  • print(t['b'])

  • 如果仅仅想要对象能够通过[]获取对象属性可以简单的:

  • def__getitem(self,item):

  • returnobject.__getattribute__(self,item)

  • 总结

    当这几个方法同时出现可能就会扰乱你了。我在网上看到一份示例还不错,稍微改了下:

  • classC(object):

  • a='abc'


  • def__getattribute__(self,*args,**kwargs):

  • print("__getattribute__()iscalled")

  • returnobject.__getattribute__(self,*args,**kwargs)


  • #return"haha"

  • def__getattr__(self,name):

  • print("__getattr__()iscalled")

  • returnname+"fromgetattr"


  • def__get__(self,instance,owner):

  • print("__get__()iscalled",instance,owner)

  • returnself


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnobject.__getattribute__(self,item)


  • deffoo(self,x):

  • print(x)


  • classC2(object):

  • d=C()


  • if__name__=='__main__':

  • c=C()

  • c2=C2()

  • print(c.a)

  • print(c.zzzzzzzz)

  • c2.d

  • print(c2.d.a)

  • print(c['a'])

  • 可以结合输出慢慢理解,这里还没涉及继承关系呢。总之,每个以__get为前缀的方法都是获取对象内部数据的钩子,名称不一样,用途也存在较大的差异,只有在实践中理解它们,才能真正掌握它们的用法。
热点内容
8岁讲编程 发布:2025-01-11 08:02:41 浏览:129
迅雷的tracker服务器地址 发布:2025-01-11 08:02:07 浏览:507
csgo天津服务器ip 发布:2025-01-11 07:57:36 浏览:613
中国天气android 发布:2025-01-11 07:56:53 浏览:464
服务器负载均衡怎么用 发布:2025-01-11 07:54:04 浏览:128
云打印服务器硬件 发布:2025-01-11 07:44:56 浏览:769
怎么在手机上更改wifi密码 发布:2025-01-11 07:37:26 浏览:337
开机启动serviceandroid 发布:2025-01-11 07:35:24 浏览:524
天龙八部脚本设置自动喊话 发布:2025-01-11 07:31:37 浏览:310
硒标准溶液配置为什么要加盐酸 发布:2025-01-11 07:27:51 浏览:253