首页 飞桨领航团 帖子详情
【AI达人养成营】python面向对象笔记
收藏
快速回复
飞桨领航团 文章AI达人创造营学习资料 287 0
【AI达人养成营】python面向对象笔记
收藏
快速回复
飞桨领航团 文章AI达人创造营学习资料 287 0

面向对象主要术语:

  • 多态(polymorphism):一个函数有多种表现形式,调用一个方法有多种形式,但是表现出的方法是不一样的。
  • 继承(inheritance)子项继承父项的某些功能,在程序中表现某种联系
  • 封装(encapsulation)把需要重用的函数或者功能封装,方便其他程序直接调用
  • 类:对具有相同数据或者方法的一组对象的集合
  • 对象:对象是一个类的具体事例
  • 实例化:是一个对象事例话的实现
  • 标识:每个对象的事例都需要一个可以唯一标识这个事例的标记
  • 实例属性:一个对象就是一组属性的集合
  • 事例方法:所有存取或者更新对象某个实例一条或者多条属性函数的集合。
  • 类属性:属于一个类中所有对象的属性,
  • 类方法:那些无须特定的对性实例就能够工作的从属于类的函数。

1、静态方法  (用这个装饰器来表示  @staticmethod  )
意思是把 @staticmethod 下面的函数和所属的类截断了,这个函数就不属于这个类了,没有类的属性了,只不是还是要通过类名的方式调用  

例:

错误示例:
 
class Person(object):
    def __init__(self, name):
        self.name = name
 
    @staticmethod  # 把eat方法变为静态方法
    def eat(self):
        print("%s is eating" % self.name)
 
 
d = Person("xiaoming")
d.eat()  
 
############## 
 
结果:
TypeError: eat() missing 1 required positional argument: 'self'

正确示例: 
 
 
class Person(object):
    def __init__(self, name):
        self.name = name
 
    @staticmethod  # 把eat方法变为静态方法
    def eat(x):
        print("%s is eating" % x)
 
 
d = Person("xiaoming")
d.eat("jack")   
 
#就把eat方法当作一个独立的函数给他传参就行了

因为用静态方法把eat这个方法与Person这个类截断了,eat方法就没有了类的属性了,所以获取不到self.name这个变量。

2、类方法  (用这个装饰器来表示 @classmethod)
类方法只能访问类变量,不能访问实例变量

例:

class Person(object):
    name="杰克"
    def __init__(self, name):
        self.name = name
 
    @classmethod  # 把eat方法变为类方法
    def eat(self):
        print("%s is eating" % self.name)
 
 
d = Person("xiaoming")
d.eat()

3、属性方法 (用这个装饰器表示 @property)
把一个方法变成一个静态属性,属性就不用加小括号那样的去调用了

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @property  # 把eat方法变为属性方法
    def eat(self):
        print("%s is eating" % self.name)
 
 
d = Person("xiaoming")
d.eat

4、成员修饰符
python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(public),私有成员(private)和保护成员(protected).并且python中没有关键字去修饰成员,默认python中所有的成员都是公有成员,但是私有成员是以两个下划线开头的名字标示私有成员,私有成员不允许直接访问,只能通过内部方法去访问,私有成员也不允许被继承。

class a:  # 说明父类的私有成员无法在子类中继承
    def __init__(self):
        self.ge=123
        self.__gene=456
 
class b(a):
    def __init__(self,name):
        self.name=name
        self.__age=18
        super(b,self).__init__()  # 这一行会报错
    def show(self):
        print(self.name)
        print(self.__age)
        print(self.ge)
        print(self.__gene)  # 这一行也会报错
obj=b("xiaoming")
print(obj.name)
print(obj.ge)
# print(obj.__gene)  # 这个也会报错
obj.show()

5、类与对象
__new__和__metaclass__

在python中,一切皆对象,我们定义的类其实。。。也是一个对象,那么,类本身是谁的对象呢?在python2.2之前(或者叫经典类中),所有的类,都是class的对象,但是在新式类中,为了将类型(int,str,float等)和类统一,所以,所有的类都是type类型的对象。当然,这个规则可以被修改,在类中有一个属性 __metaclass__ 可以指定当前类该由哪个类进行实例化。而创建对象过程中,其实构造器不是__init__方法,而是__new__方法,这个方法会返回一个对象,这才是对象的构造器。下面是一个解释类实例化对象内部实现过程的代码段:

class Mytype(type):
    def __init__(self, what, bases=None, dict=None):
        super(Mytype,self).__init__(what, bases, dict)
    def __call__(self, *args, **kwargs):
        obj=self.__new__(self)
        self.__init__(obj, *args, **kwargs)
        return obj
class Foo:
    __metaclass__=Mytype
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls)
obj=Foo("xiaoming",18)
print(obj.name,obj.age)
执行结果:xiaoming 18
0
收藏
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户