面向对象编程(一)创建类,实例化,属性引用

来源:互联网 发布:tom围棋 mac 编辑:程序博客网 时间:2024/06/16 03:42

  在python中,用变量表示特征,用函数表示技能,因而类是变量与函数的结合体,对象是变量与方法(指向类的函数)的结合体。

class 类名:#定义一个类    类体

  类有两种作用:属性引用和实例化

t=类名()#实例化
 
类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征

class 类名:    def __init__(self,x):#self的作用是在实例化时自动将对象/实例本身传给__init__的第一个参数,self可以是任意名字        self.x=x     #给__init__的第一个参数,self可以是任意名字t=类名(特征)        
数据调用
class 类名:    w=1    def __init__(self,x):        self.x=x    def foo(self):        print('foo')t=类名(参数)t.w=1#调用变量t.foo()#调用函数

  对象/实例本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方法,或者叫绑定方法,绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法,内存地址都不会一样。

  对象的绑定方法的特别之处在于:obj.func()会把obj传给func的第一个参数。

==========================

  创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:数据属性和函数属性。其中类的数据属性是共享给所有对象的,而类的函数属性是绑定到所有对象的。

class Star:    x=1    def __init__(self,name):        self.name=name    def foo(self):        return 'foo from {} '.format(self.name)tom=Star('tom')jack=Star('jack')print(tom.x,id(tom.x))#1 内存地址1763226688print(jack.x,id(jack.x))#1 内存地址1763226688print(tom.foo(),tom.foo)     # foo from tom  <bound method Star.foo of <__main__.Star object at 0x000001DD163FD588>>print(jack.foo(),jack.foo)    #foo from jack  <bound method Star.foo of <__main__.Star object at 0x000001DD163FD5C0>>


 


创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性。
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常  

print(tom.__dict__)#{'name': 'tom'}print(jack.__dict__)#{'name': 'jack'}print(Star.__dict__)#{'__module__': '__main__', 'x': 1,#  '__init__': <function Star.__init__ at 0x000001FCEB7BB8C8>, # 'foo': <function Star.foo at 0x000001FCEB7BB950>, # '__dict__': <attribute '__dict__' of 'Star' objects>, # '__weakref__': <attribute '__weakref__' of 'Star' objects>, 
#'__doc__': None}



阅读全文
0 0