Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待
4999元包邮
去购买 >
define class
class的三个组成部分:
类的名称:类名
类的属性: 一组数据
类的方法:允许对进行操作的方法(行为)
定义
class Student (object):
pass
class后面定义类名(类名通常是大写开头的单词)
(object),表示该类是从哪个类继承下来的
实例化
创建实例是通过类名+()实现
stu = Student()
class Stu (): # 定义class
age = 10 # 属性
def show (self): # 方法
print(self.age) # 类中获取属性
print(self, 'self')
print(stu.name) # 获取类外添加属性
stu = Stu() # 实例化
stu.name = 'sf' # 添加属性
stu.show() # 调用方法
self
self当前实例化的对象
在定义函数的时候,第一个参数需要self
class Stu ():
def show_name (self):
print(self.name)
stu = Stu()
stu.name = 'sf'
stu.show_name()
self在定义时需要定义,但是在调用时会自动传入。
self的名字并不是规定写死的,但是最好还是按照约定是self。
self总是指调用时的类的实例。
init
魔法方法:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
__init__: 构造函数(魔法方法)
class Stu ():
# 初始化对象
def __init__ (self, new_name, new_age):
self.name = new_name
self.age = new_age
def show (self):
print('name: %s, age: %d' % (self.name, self.age))
stu = Stu('sf', 23)
stu.show()
创建对象的过程:
创建一个对象
Python解释器会自动的调用__init__方法
返回创建的对象的引用,给实例
__str__: 实例化执行该方法,返回值。
当需要print一个类的时候,需要先在类中定义__str__方法,返回值,就是print()输出的值
class Stu ():
def __init__ (self, new_name):
self.name = new_name
def __str__ (self):
return self.name
私有方法和私有属性
私有属性
按照约定俗成的规定__开头的属性表示私有属性, 不可以直接类名.变量名访问
在类中存储的形式为:_Stu__age, _类名__变量名
class Stu():
def __init__(self, new_name):
self.name = new_name
self.__age = 0 # 定义了一个私有的属性,属性的名字是`__age`
在类中访问形式:self.__变量名
私有方法(private)
按照约定俗成的规定__开头的属性表示私有方法, 不可以直接类名.方法名访问
存储的形式为:_Stu__get_age, _类名__方法名
class Stu():
def __test(self): # 定义私有方法
pass
在类中调用私有方法:self.__方法名()
有些时候,会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
del
__del__: 当删除一个对象时,python解释器会默认调用一个魔术方法,__del__()
class Stu():
def __del__ (self):
print('remove obj')
stu = Stu()
del stu
在类的生命周期中,如果类销毁了,python会自动调用__del__方法。也就是说,不管是手动调用del还是由python自动回收都会触发__del__方法执行。
对象引用个数
模块sys中有一个getrefcount方法可以测试对象的引用个数
返回的结果,会比实际结果大1.
import sys
sys.getrefcount('变量/方法')
继承
class Animal(object):
def run(self):
print('Animal is running')
class Dog(Animal): # 继承
def run(self):
print('Dog is running')
class Cat(Animal):
pass
dog = Dog()
cat = Cat()
dog.run()
cat.run()
当子类和父类都存在相同的run()方法时,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run() -- 多态
重写
重写子类的方法
原文链接:https://segmentfault.com/a/1190000013175369