1.x是类的公有属性
class Animal:
x = 10
def test(self):
print(Animal.x)
print(self.x) #self是类本身,等于Animal
class Dog(Animal):
def test2(self):
print(Dog.x)
print(self.x)
a = Animal()
a.test() #在类内部访问
print(Animal.x)
print(Dog.x) #在模块文件内的其他位置访问
公有属性可以在类内部访问,子类内部访问,在模块文件内的其他位置访问,跨模块访问
跨模块访问有两种方式
一,import 文件名
引用文件名中的属性需要加模块名
eg:print(文件名.a)
二,from 文件名 import *
引用文件名中的属性不需要加模块名
eg:print(a
2._x是类的受保护属性
class Animal:
_x = 10
def test(self):
print(Animal._x)
print(self._x) #self是类本身,等于Animal
受保护属性可以在类内部访问,子类内部访问,在模块文件内的其他位置访问(会有警告,但可以访问),不可以跨模块访问
当文件中有__all__ = ["属性1"],此时可以跨模块访问,如下
__all__ = ["_b"]
_b = 2 #_b可以跨模块访问
3.__x是类的私有属性(两个下划线)
class Animal:
__x = 10
def test(self):
print(Animal.__x)
print(self.__x)
私有属性只能在类内部访问,当文件中有__all__ = ["属性1"],此时可以跨模块访问
子类内部,在模块文件内的其他位置都不可以跨模块访问
注:以下的操作
class Person:
def __init__(self):
self.__age = 18
p = Person()
p.__age = 10 #此时生成的是实例对象,而不是更改类中的对象
print(p.__age)
print(p.__dict__) #{'_Person__age': 18, '__age': 10}
print(Person().__dict__) #{'_Person__age': 18}
4.只读属性
4.1实现方法1
class Person:
def __init__(self):
self.__age = 20
def getAge(self):
return self.__age
p1 = Person()
print(p1.getAge())
4.2使用propery装饰器
propery装饰器作用:能够以读取属性的方式调用方法
class Person(object):
def __init__(self):
self.__age = 20
@property
def age(self):
return self.__age
p1 = Person()
print(p1.age) #20 以读取属性的方式调用方法
p1.age = 50 #会报错,私有属性不能赋值