微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从外部类向类方法添加属性?

如何解决如何从外部类向类方法添加属性?

这将是我在本网站上的第一个问题。如果我在英语方面做错了,抱歉。 好吧,我的问题是如何从外部类向类方法添加或设置属性

如果我没记错的话,我们使用 settatr() 来做到这一点。你们能帮我吗?

class sss():
   def __init__(self,name,surname):
       self.name = name
       self.surname = surname
   def method1(self):
       a = "Python"

当我们这样做时:

object = sss("Adam","Roger") #This 2 lines are on outside the class
setattr(object,"Age",19)

究竟发生了什么?现在这个“年龄”属性属于我们的对象?现在“年龄”属性的值是多少?我的意思是那个类属性还是什么?

我的第二个问题是如何向类方法添加属性

谢谢

解决方法

如果您使用例如实例化您的课程person = Sss("Adam","Roger") 您可以使用这样的点访问和添加属性:

person.age = 19

完整示例:

class Sss:
    # You should name your class with capital letter and without brackets
    def __init__(self,name,surname):
        self.name = name
        self.surname = surname


person = Sss("Adam","Roger")
print(person.name) # access attribute

person.age = 19 # add attribute
print(person.age)
,

现在什么是“年龄”属性?我的意思是那个类属性还是什么?

Age 现在是名为 sssobject 实例上的实例变量。

如何为类方法添加属性?

我不确定你在这里要求什么。

,

正如@Julian Fock 提到的,您可以通过简单地编写语句来为对象添加属性,例如 person.age = 19sss-Person 类的实例/对象现在将具有此属性,但没有类本身。

要修改类 sss-Person 本身,您需要实现一些丑陋的方法,这些方法会被大多数程序员标记为“hacky”或“bad practice”。公司可以拒绝接受该代码为有效。您应该考虑使用其他方法,例如 class inheritance,您可以在其中派生一个修改后的类,添加更多高级功能。

不过,更改 class 定义对于调试或特殊紧急情况很有用。在这种情况下,您可以定义外部函数,并将它们链接起来以覆盖您的类方法,如下所示:

# A) Initial Analysis

class Person:
   def __init__(self,surname):
       self.name    = name
       self.surname = surname
   def method1(self):
       a = "Python"

person1 = Person("Adam","Roger")
person2 = Person("Adam","Roger")

person1.age = 19

print(person1.age)
# Output: 19

# print(person2.age)
# AttributeError: 'Person' object has no attribute 'age'

# B) Change class attributes

def __init2__(self,surname,age):
    self.name    = name
    self.surname = surname
    self.age     = age

Person.__init__ = __init2__

person3 = Person("Adam","Roger",20)

print(person3.age)
# Output: 19

# person4 = Person("Adam","Roger")
# TypeError: __init2__() missing 1 required positional argument: 'age'


# C) Overwrite method1

def method2(self):
    self.a = "Python"

Person.method1 = method2

person5 = Person("Adam",44)
person5.method1()
print(person5.a)
# Output: "Python"
,

PS.:我不会讨论是否建议做我将在这里举例说明的事情的优点。

添加到比尔林奇的答案

现在什么是“年龄”属性?我的意思是那个类属性还是什么?

年龄现在是您的 sss 命名对象实例上的实例变量。

PS.:不要使用object,因为它是python中的关键字。

现在“年龄”属性的值是多少?

值为 19。

我的意思是那个类属性还是什么?

它是您从类创建的实例的属性,并且仅用于该实例。

如何为类方法添加属性?

如果您想将属性添加到类中以便每个实例都有您选择的新属性,您可以这样做:

    setattr(sss,'b','Python')

    obj1 = sss("Adam","Roger")
    print(obj1.b)

    obj2 = sss("Adam","Roger")
    print(obj2.b)

    obj2.b = "New"

    print(obj1.b) # will still be Python
    print(obj2.b) # now will be New

如果你想用一个新方法覆盖 method1:

    sss_obj = sss("Adam","Roger")

    def method1(self):
        self.b = 'New'

    setattr(sss,'method1',method1)

    print('Should be False because the instance has no b attribute yet.',hasattr(sss_obj,'b'))

    sss_obj.method1()

    print('Now it has and b value is',sss_obj.b)

如果您想更改类 sss 的特定实例上的方法:

    sss_obj = sss("Adam","Roger")
    sss_obj2 = sss("Adam","Roger")

    def method1():
        sss_obj2.b = 'New'

    setattr(sss_obj2,method1)

    sss_obj.method1()
    print('Should be False because method1 from instance sss_obj does not set b.','b'))

    sss_obj2.method1()
    print('Now on instance 2 the b value is',sss_obj2.b)

如果您想以编程方式将方法的源更改为字符串:

    sss_obj = sss("Adam","Roger")

    new_method_source = 'self.b = "NotRecommended"\n' \
                        'print("Got into changed method")'

    def method1(self):
        return exec(
            compile(new_method_source,'',mode='exec'),None,{
                'self': self
            }
        )

    setattr(sss,method1)

如果你想改变method1的代码,先用下面这行获取源码

method1_src = inspect.getsource(sss_obj.method1)

然后随意更改字符串并执行与前面提到的类似的操作(编译和其他内容)。

干杯

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?