面向对象-属性,方法及类

     对面向对象有了解的童鞋,一定听说过公有,私有,静态等名词,当然我也不例外,这些单词时不时就会在工作中碰到,但是一直都没有完全弄清楚它的特性及使用场景,因此决定抽出一些时间,做一下深入的了解,以免忘记,记录在博客内。

    (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)




posted on 2018-12-12 14:14  罗盼  阅读(164)  评论(0)    收藏  举报

导航