其他关于Python的总结文章请访问:https://www.jianshu.com/nb/47435944
Python中面向对象编程的一些高级方法拾遗
声明类中的私有变量
定义类中的私有变量,只要将变量名前加双下划线即可__
,如果一个变量名以__
开头,它就是一个私有变量(private),只能在类内部访问,不能外部访问(比如__name
)。
但是开头结尾都有双下划线__
的变量是特殊变量,特殊变量是可以直接访问的,不是private变量,所以不要定义这种变量(比如__name__
)
但但是,其实双下划线的变量是可以访问的,需要使用 单下划线+类名+双下划线的变量名
访问(比如Student
类中的__name
变量,可以使用 instance._Student__name
来访问的),但是既然设置成了私有变量,那就是不想让访问,一定要这么做是没有什么特别的好处的。
实例属性与类属性
定义在类中的 __init__
函数中的变量(比如self.name
)是属于实例的,即每一个实例都有自己的 self.name
。而定义在类中,__init__
函数外部(前)的变量则是属于类自己的变量,比如这样定义的变量:
class Student(object):
name = 'Student'
属于类的属性是不会因实例而异的,所有实例都拥有同样的类属性。
限制给实例添加的属性
动态语言中,可以给对象(object
)动态添加属性,比如一个student
实例,可以临时添加 student.name
的属性,或者给Student
类动态添加属性 Student.name
,使用 __slots__
可以限制给一个类的实力添加的属性:
class Student():
__slots__ = ('name', 'age')
这样一来Student
的实例就只能动态添加name
和age
两个属性,添加其他的会报错:
student = Student()
student.name = "Hello"
student.age = 12
student.score = 100 # Raise AttributeError: 'Student' object has no attribute 'score'
使用@property将方法“变为”属性
类中,通常为了不暴露一些变量,或者对一些变量的做限制,会猜用定义一个私有变量(比如score
),然后使用两个方法:一个get方法来获取变量值(比如get_score
)和一个set方法来修改变量的值(比如set_score
)来完成。使用时需要调用两个方法。
使用装饰器 @property
可以更简单的做到这一点,它可以将一个方法“变成”属性:
- 只使用
@property
定义只读属性:
class Student():
@property
def name(self):
return "Lily"
student = Student()
print(student.name)
- 使用
@property
和配套产生的@NAME.setter
来定义可读属性:
class Student():
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
student = Student()
student.name = "Lily"
print(student.name)
多重继承
Python支持多重继承,即一个子类可以继承自多个父类,只要在子类的括号中传入多个要继承的父类即可:
class Student():
pass
class Teacher():
pass
class Someone(Student,Teacher):
pass
网友评论