面向对象——类的属性和方法

  • Post author:
  • Post category:其他




面向对象



类的三大属性



封装

封装是一个信号,用来告诉开发者这个类中的属性是否可以改变。一般来说,我们用getter()方法来表示该属性不能被修改,用setter()方法来说明这个类如果要被修改应该使用的手段和方法。

  • 可以用在属性前加一个_来表示该属性是不允许被修改的。
  • 同时也可以加 __来表示该属性是被隐藏的,这种时候可以不用getter()和setter()方法。


注意:封装后的类的属性依旧是可以被修改的,getter()方法只是做到提示。

class Dog():
    def __init__(self,name):
        self._name=name
    #getter()
    def get_name(self):
        print('get')
        return self._name
    #setter()
    def set_name(self,name):
        self._name=name
dog=Dog('藏獒')
print(dog._name)
print(dog.get_name())



property装饰器

  • @property   property装饰器可以让程序不可被修改
  • @name.setter()   即修改属性的setter()方法
class Person():
    def __init__(self,name):
        self._name=name
    #getter()
    @property
    def name(self):
        print('get')
        return self.name
    #setter()
    @name.setter
    def name(self,name):
        self._name=name



继承

继承是python中一个非常重要的属性,可以通过继承获取父类的方法,进而使代码变得简洁,可操作性强。所有类都有一个共同的父类——object

值得一提的是,我们可以用issubclass来判断两个类之间是否有继承关系。

class animal():
    def __init__(self,name):
        self.name=name
    def run(self):
        print('%s会跑'%self.name)
    def sleep(self):
        print('%s会睡觉'%self.name)
class dog(animal):
    pass
dog1=dog('藏獒')
dog1.run()
print(issubclass(animal,object))
print(issubclass(dog,animal))
print(issubclass(animal,dog))



多重继承

一个类可以同时作为几个类的子类,同时具有它们的方法。

class A:
    def method1(self):
        print('a')
class B:
    def method2(self):
        print('b')
class C(A,B):
    pass

print(C.__bases__)
print(issubclass(C,A))
print(issubclass(C,B))
c=C()
c.method1()
c.method2()



多态

让代码变得更加灵活,操作更加方便。

class Person():
    def __init__(self,name):
        self._name=name
    def run(self):
        print('人能跑')
    #getter()
    @property
    def name(self):
        print('get')
        return self._name
    #setter()
    @name.setter
    def name(self,name):
        self._name=name

class person(Person):
    pass

a=Person('a')
b=person('b')

def speak(name):
    print('好好学习 %s'%name)
speak(a._name)
speak(b._name)
speak(a.name)
speak(b.name)
def run(x):
    x.run()
run(a)

speak()函数就是类的多态的表现,我们还可以直接使用类中的方法如:run()



属性和方法

  • 类属性:定义在类中的,只能在类中被修改。类属性可以通过类和该类的实例进行访问
class A:
    #类属性,定义在类内的
    #类属性可以用类和该类的实例访问
    num = 0

a=A()
a.num = 10
print(a.num)
print(A.num)
  • 实例属性:只能通过实例对象访问,无法通过类对象访问
  • 类方法:可以通过类对象调用,也可以通过实例对象调用(通过@classmethod调用)
  • 实例方法:通过实例对象进行调用,但不能用类对象调用(通过创建实例调用)
  • 静态方法:静态方法 和这个类没有关系,不用指定参数,实例和类方法都可以调用(通过@staticmethod调用)
class A:
    #类属性,定义在类内的
    #类属性可以用类和该类的实例访问
    num = 0

a=A()
a.num = 10
print(a.num)
print(A.num)


class number():
    def __init__(self,num):
        self.num = num
    def text(self):
        print('text')
    @classmethod
    def text2(cls):
        print('text2')
    @staticmethod
    def text1():
        print('text1')

#实例属性只能通过实例对象访问,无法通过类对象访问
b=number(10)
print(b.num)
# print(number.num)   wrong!!

#实例方法
b.text()
#类方法
#可以通过类对象调用,也可以通过实例对象调用
b.text2()
number.text2()
#静态方法  和这个类没有关系,不用指定参数,实例和类方法都可以调用
b.text1()
number.text1()



方法的重写

super()方法可以使用父类的方法

一般我们可以用_base_方法查看继承了什么类

#super()获取父类的方法
class animal():
    def __init__(self,name):
        self.name=name
    def run(self):
        print('%s会跑'%self.name)
    def sleep(self):
        print('%s啊会睡觉'%self.name)
class dog(animal):
    def __init__(self, name):
        self.name = name

    def run(self):
        print('%s会跑' % self.name)

    def sleep(self):
        print('%s会睡觉' % self.name)
        super().sleep()
dog1=dog('狗')
dog1.sleep()

#查看继承了什么类
print(dog.__base__)



版权声明:本文为Compute_r原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。