python-类
1. dir(类名)
- 查看该类的所有属性和方法。
2. __init__() 作为一个特殊方法,它里面一般是规定一些属性或做一些初始化,让类具有一些基本特征(属性)。但是它没有return语句,这一点是区别与其他方法的。
3.
- 当类中变量引用的是不可变对象时(如字符串),类属性不因实例属性的变化而变化;实例属性跟着类属性的改变而改变。
>>class A:
>> x = 7 %属性A.x
>>foo = A() %创建实例A()并赋值给变量foo
>>foo.x %实例属性
7
- 当类中变量引用可变对象(如列表),类属性和实例属性都能修改这个对像,从而影响另一方的值
>>class B:
>> y = [1,2,3]
>>bar = B()
>>B.y.append("aa") %修改类属性
>>B.y
[1,2,3,"aa"]
>>bar.y
[1,2,3,"aa"]
>>bar.y.append(4) %修改实例属性
>>bar.y
[1,2,3,"aa",4]
>>B.y
[1,2,3,"aa",4]
4. if__name__ == "__main__": 的作用
# file one.py
def func():
print("func() in one.py")
print("top-level in one.py")
if __name__ == "__main__":
print("one.py is being run directly")
else:
print("one.py is being imported into another module")
# file two.py
import one
print("top-level in two.py")
one.func()
if __name__ == "__main__":
print("two.py is being run directly")
else:
print("two.py is being imported into another module")
如果你执行one.py文件,
python one.py
会输出:
top-level in one.py
one.py is being run directly
如果你执行two.py文件,
python two.py
会输出:
top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly
class Foo:
lang = "Java" %类属性
def __init__(self):
self.lang = "python" %实例属性
@classmethod
def get_class_attr(cls):
return cls.lang
if __name__ == "__main__":
print("Foo.lang:", Foo.lang)
r = Foo.get_class_attr()
print("get class attrbute:", r)
f = Foo()
print("instance attribute:", f.lang)
print("instance get_class_attr:", f.get_class_attr())
输出:
Foo.lang: Java get class attrbute: Java instance attribute: python instance get_class_attr: Java
不管是类还是实例来执行get_class_attr(), 得到的结果都是类属性值,说明装饰器@classmethod修饰的方法,其参数cls引用的对象是类对象Foo.
5.静态方法
import random
class Foo:
def__init__(self,name):
self.name = name
def get_name(self,age):
if self.select(age):
return self.name
else:
return "the name is secret"
@staticmethod
def select(n):
a = random.randint(1,100)
return a-n >0
import __name__ == "__main__":
f = Foo("luo")
name = f.get_name(22)
print(name)
虽然select()函数在类里面但是和其他方法不同,它不以self为第一个参数。当使用它时,可以通过实例调用,如 self.select(n),也可以通过类调用这个方法,如 Foo.select(n).为它加上一个装饰器@staticmethod,称为静态方法。
6. 继承
C.__base__ 可以得到类的父类
子类继承父类的全部属性和方法,但若子类中的方法或属性覆盖了父类(与父类同名)---称为对父类相应部分的重写,则就不再继承父类的该方法或属性。
- 调用覆盖的方法