类和实例

通过廖雪峰的Python教程学习http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431865288798deef438d865e4c2985acff7e9fad15e3000

类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

class Student():
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def print_score(self):
        print('%s: %s' % (self.name, self.score))

bart = Student("kanxue",150)
bart.print_score()
注意到init方法的第一个参数永远是self,表示创建的实例本身。
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self

访问限制

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student(object):
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))

使用set和get

def get_name(self):
        return self.__name
def set_score(self, score):
        self.__score = score

继承和多态

参考Java
class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):

    def run(self):
        print('Dog is running...')

class Cat(Animal):

    def run(self):
        print('Cat is running...')

def run_twice(animal):
    animal.run()

a = Animal()
b = Dog()
c = Cat()

run_twice(a)
run_twice(b)
run_twice(c)

D:\ikanxue\program\Python3.5\python.exe D:/ikanxue/kanxue_studio/Python3.5/pythonTest/class_unit/classInheritance.py
Animal is running…
Dog is running…
Cat is running…

Process finished with exit code 0

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:
class Timer(object):
    def run(self):
        print('Start...')
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

动态添加属性和方法

from types import MethodType

class Student(object):
    __slots__ = ('name', 'age','set_age')

def set_age(self,age):
    self.age = age

b = Student()
a = Student()
a.name = "kanxue"
a.set_age = MethodType(set_age,a)
a.set_age(25)

print(a.age)
print(a.name)

# print(b.name)
# print(b.age)
Student.set_age = set_age
b.set_age(100)

print(b.age)

D:\ikanxue\program\Python3.5\python.exe D:/ikanxue/kanxue_studio/Python3.5/pythonTest/class_unit/highcla.py
25
kanxue
100

Process finished with exit code 0

给一个实例绑定的方法,对另一个实例是不起作用的。
给所有实例都绑定方法,可以通过给class绑定方法
__slots__用来限制实例的属性
class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
如果在子类中也定义__slots__,那么,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值