面向对象-属性,方法及类
对面向对象有了解的童鞋,一定听说过公有,私有,静态等名词,当然我也不例外,这些单词时不时就会在工作中碰到,但是一直都没有完全弄清楚它的特性及使用场景,因此决定抽出一些时间,做一下深入的了解,以免忘记,记录在博客内。
(1)属性
公有属性---属于类,每个类有一份;可通过类及其实例访问,可以被子类继承,被子类及其实例访问;
私有属性---只能在类里面访问,不可被继承;
普通属性---属于对象,每个对象一份;
(2)方法
普通方法---普通方法或者实例方法,可通过父类实例或者子类实例访问,会将类实例通过self传递过来。通过类访问实例方法会报错
私有方法---私有方法,必须通过构造另一个函数来访问私有方法
静态方法---一般建议通过类直接调用。方法中不涉及类的属性或者其他方法的调用。【实际父类及其实例或者子类及其实例都可以访问】
类方法---只能访问类变量,不能访问实例变量。一般建议通过父类或者子类访问。(类方法会将类通过cls传递过来)【实际父类及其实例或者子类及其实例都可以访问】
import time
class Dog(object):
# 公有属性,属于类,可通过类及其实例或者子类及其实例访问
age = "1"
food = "bone"
# 私有属性,只能在类里面访问。
__name = "Wangzai"
# 类方法:只能访问类变量,不能访问实例变量。一般建议通过父类或者子类访问。(类方法会将类通过cls传递过来)【实际父类及其实例或者子类及其实例都可以访问】
@classmethod
def eat_bone(cls):
print("{0} is {1} older, he likes {2}".format(cls.__name,cls.age, cls.food))
@classmethod
def eat_meat(cls):
cls.food = "meat"
print("{0} is {1} older, he likes {2}".format(cls.__name,cls.age, cls.food))
# 静态方法:一般建议通过类直接调用。方法中不涉及类的属性或者其他方法的调用。【实际父类及其实例或者子类及其实例都可以访问】
@staticmethod
def show_time():
print(time.strftime("%H:%M:%S", time.localtime()))
# 普通方法或者实例方法,可通过父类实例或者子类实例访问,会将类实例通过self传递过来。通过类访问实例方法会报错。
def noramalmethod(self):
print(self.food)
# 私有方法,必须通过构造另一个函数来访问私有方法
def __personalmethod(self):
print(self.food)
# 通过普通方法访问私有方法
def test_personmethod(self):
self.__personalmethod()
class ChildDog(Dog):
# 子类新增的公有属性,只能通过子类及其实例访问
weight = "10"
# 继承并重写父类属性
# food = "rice"
# 继承并重写父类方法
def noramalmethod(self):
print("子类普通方法")
if __name__ == '__main__':
dog = Dog()
child_dog = ChildDog()
print(dog.food) # 通过父类实例访问父类的公有属性
print(Dog.food) # 通过父类直接访问父类的公有属性
print(child_dog.food) # 通过子类实例访问父类的公有属性
print(ChildDog.food) # 通过子类访问父类的公有属性
# print(dog.__name) 报错:'Dog' object has no attribute '__name',因为私有属性只能在类里面访问。
# 普通属性,属于对象,每个对象一份
dog.color = "balck"
print(dog.color)
dog.eat_bone() # 通过父类实例访问父类的类方法
Dog.eat_bone() # 通过父类直接访问父类的类方法
ChildDog.eat_bone() # 通过子类访问父类的类方法
child_dog.eat_bone() # 通过子类实例访问父类的类方法
Dog.show_time() # 通过类直接调用静态方法
# Dog.noramalmethod() 报错:noramalmethod() missing 1 required positional argument: 'self'
dog.noramalmethod() # 通过父类实例访问父类的普通方法
# ChildDog.noramalmethod()
child_dog.noramalmethod() # 通过子类实例访问父类的普通方法。若子类定义方法覆盖父类方法,则访问的是子类方法。
dog.test_personmethod() # 通过普通方法访问私有方法
print(ChildDog.weight)
print(child_dog.weight)
浙公网安备 33010602011771号